package com.bacon.gmall.mq.Listener;

import com.bacon.gmall.mq.config.DeadLetterMqConfig;
import com.bacon.gmall.mq.config.DelayMQConfig;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.annotation.RabbitListeners;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Date;

/**
 * @author： bacon、
 * @version： 1.0
 * @create： 2021-01-08 19:50
 * @description:
 */
@Component
public class ConsumerController {

    @RabbitListener(queues = "queueBacon")
    public void receiveMessage(String msg,
                               Channel channel,
                               Message message) {
        System.out.println(msg);

        //手动应答
        //参数一： 消息标记
        //参数二： 是否将消息放回队列中 true ： 放回  false ： 不放回
        try {
            //int i = 1 / 0;
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),
                    false);
        } catch (Exception e) {
            //e.printStackTrace();
            try {

                //重新发送 第二次发送进行拒绝应答
                if (message.getMessageProperties().isRedelivered()) {
                    //第二次
                    //参数一： 消息标记
                    //参数二： 是否将消息放回队列中 true ： 放回  false ： 不放回
                    System.out.println("拒绝");
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),
                            false);
                } else {
                    //第一次发
                    //参数一： 消息标记
                    //参数二： 是否批量 ， 公平分发
                    //参数二： 是否将消息放回队列中 true ： 放回  false ： 不放回
                    System.out.println("第一次发，可以再发一次");
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),
                            false,
                            true);
                }
            } catch (Exception a) {
                a.printStackTrace();
            }
        }
    }

    //接收延迟消息
    //@RabbitListener(queues = DeadLetterMqConfig.queue_dead_2)
    @RabbitListeners(value = {
            @RabbitListener(queues = DeadLetterMqConfig.queue_dead_2),
            @RabbitListener(queues = DelayMQConfig.queue_delay_1)
    })
    public void receiveDeadLetterMessage(String msg,
                               Channel channel,
                               Message message) throws IOException {
        System.out.println("接收到的延迟时间 : "+new Date());
        System.out.println(msg);
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),
                false);
    }
}
